package dao;

import java.util.List;

import hibernate.HibernateUtil;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.Restrictions;

import comun.CasillaCorreo;
import comun.Usuario;

public class UsuarioDAO
{
	private static UsuarioDAO instancia = null;
	private static SessionFactory sf = null;

	public static UsuarioDAO getInstancia() {
		if (instancia == null){
			sf = HibernateUtil.getSessionFactory();
			instancia = new UsuarioDAO();
		}
		return instancia;
	}
	
	public void addUsuario(Usuario usuario){
		Session session = sf.openSession();
		session.beginTransaction();
		session.saveOrUpdate(usuario);
		session.getTransaction().commit();
		session.flush();
		session.close();
	}
	
	@SuppressWarnings("unchecked")
	public List<Usuario> getUsuarios(){
		Session session = sf.openSession();
		Criteria criteria = session.createCriteria(Usuario.class);
		List<Usuario> list = (List<Usuario>) criteria.list();
		session.close();
		return list;
	}
	
	public Usuario getUsuario(Usuario user){
		Usuario usuario  = null ;
		Session session = sf.openSession();
		Criteria criteria = session.createCriteria(Usuario.class);
		usuario = (Usuario) criteria.add(Restrictions.eq("nombreUsuario" , user.getNombre())).uniqueResult() ;
		session.close();
		return usuario ;
	}
	
	public Usuario getUsuarioPorNombre(String nomUsuario){
		Usuario usuario  = null ;
		Session session = sf.openSession();
		Criteria criteria = session.createCriteria(Usuario.class);
		usuario = (Usuario) criteria.add(Restrictions.eq("nombreUsuario" , nomUsuario)).uniqueResult() ;
		session.close();
		return usuario ;
	}
	/*
	public List<CasillaCorreo> getCasillasUsuario(String nombreUsuario){
		Session session = sf.openSession();
		System.out.println("abri sesion");
		Criteria criteria = session.createCriteria(Usuario.class);
		criteria.createCriteria("casillas");
		criteria.setFetchMode(nombreUsuario, FetchMode.JOIN);
		Criteria criteria2 = session.createCriteria(CasillaCorreo.class);
		criteria2.add(Expression.eq("nombreUsuario",nombreUsuario));		
		System.out.println("hice criteria");		
		//criteria.add(cRestrictions..eq("casillas", nombreCasilla));
		List<CasillaCorreo> list = (List<CasillaCorreo>) criteria.list();
		System.out.println("Voy a cerrar sesion, hice list");
		System.out.println("El tamanio de la lista es: "+list.size());
		session.close();
		return list;
	}*/
	
	public List<CasillaCorreo> getCasillasDelUsuario(String nombreUsuario){
		Session session = sf.openSession();
		System.out.println("abri sesion");
		Criteria criteria = session.createCriteria(Usuario.class);
		//criteria.createCriteria("casillas");
		criteria.setFetchMode(nombreUsuario, FetchMode.JOIN);
		criteria.add(Expression.eq("nombreUsuario",nombreUsuario));		
		System.out.println("hice criteria");		
		//criteria.add(cRestrictions..eq("casillas", nombreCasilla));
		Usuario aux = (Usuario) criteria.uniqueResult();
		List<CasillaCorreo> list = (List<CasillaCorreo>) aux.getCasillas();
		
		System.out.println("Voy a cerrar sesion, hice list");
		System.out.println("El tamanio de la lista es: "+list.size());
		session.close();
		return list;
	}
}
